﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;
using Entities;

namespace DAL
{
    public class ClientesDAL
    {
        private static MySqlConnection SqlConnection1;
        private static MySqlDataAdapter SqlDataAdapter1;
        private static MySqlCommand SqlSelectCommand1;
        private static MySqlCommand SqlInsertCommand1;
        private static MySqlCommand SqlUpdateCommand1;
        private static MySqlCommand SqlDeleteCommand1;
        public static DataSet dt;
        private static DataTable boundTable;

        public static DataSet CrearDataset()
        {
            try
            {
                MySqlDataAdapter da = AdaptadorSELECT();
                dt = new DataSet();
                da.Fill(dt, "Clientes");
            }
            catch (MySqlException)
            {
                MessageBox.Show("No se pudo realizar la operación. No hay conexión con el servidor.");
            }
            return dt;
        }

        public static DataTable Buscar(DataTable tabla, TextBox txtParametros)
        {
            try
            {
                IEnumerable<DataRow> query =
                    from cliente in tabla.AsEnumerable()
                    where (cliente.RowState != DataRowState.Deleted)
                    select cliente;
                boundTable = query.CopyToDataTable<DataRow>();
                IEnumerable<DataRow> query2 =
                    from cliente in boundTable.AsEnumerable()
                    where (cliente.Field<string>("RazonSocialCLI").ToLower().StartsWith(txtParametros.Text.ToLower()))
                    select cliente;
                boundTable = query2.CopyToDataTable<DataRow>();
                return boundTable;
            }
            catch (InvalidOperationException)
            {
                MessageBox.Show("No se encontraron registros coincidentes.", "NcSoft", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return boundTable;
            }

        }

        public static void InsertarDT(DataTable tabla, Clientes entidad)
        {
            DataRowCollection cfilas = tabla.Rows;
            DataRow nuevaFila;
            try
            {
                nuevaFila = tabla.NewRow();
                nuevaFila[0] = entidad.IdCliente.ToString();
                nuevaFila[1] = entidad.RazonSocial.ToString();
                nuevaFila[2] = entidad.Cuit.ToString();
                nuevaFila[3] = entidad.Direccion.ToString();
                nuevaFila[4] = entidad.Localidad.ToString();
                nuevaFila[5] = entidad.Provincia.ToString();
                nuevaFila[6] = entidad.Transporte.ToString();
                nuevaFila[7] = entidad.Contacto.ToString();
                nuevaFila[8] = entidad.Telefono.ToString();
                nuevaFila[9] = entidad.Movil.ToString();
                cfilas.Add(nuevaFila);
            }
            catch (ConstraintException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        public static void EditarDT(DataRowView vistaFilaActual, Clientes entidad)
        {
            vistaFilaActual.BeginEdit();
            vistaFilaActual["RazonSocialCLI"] = entidad.RazonSocial.ToString();
            vistaFilaActual["CUIT"] = entidad.Cuit.ToString();
            vistaFilaActual["DireccionCLI"] = entidad.Direccion.ToString();
            vistaFilaActual["LocalidadCLI"] = entidad.Localidad.ToString();
            vistaFilaActual["ProvinciaCLI"] = entidad.Provincia.ToString();
            vistaFilaActual["TransporteCLI"] = entidad.Transporte.ToString();
            vistaFilaActual["ContactoCLI"] = entidad.Contacto.ToString();
            vistaFilaActual["TelefonoCLI"] = entidad.Telefono.ToString();
            vistaFilaActual["MovilCLI"] = entidad.Movil.ToString();            
            vistaFilaActual.EndEdit();
        }

        public static void EditarDT(string idItem, DataTable tbl, Clientes entidad, DataSet dt)
        {
            DataRow[] foundRows;
            foundRows = dt.Tables["Clientes"].Select("IdClienteCLI = " + idItem);
            DataRow filaActual = foundRows[0];
            filaActual.BeginEdit();
            filaActual["RazonSocialCLI"] = entidad.RazonSocial.ToString();
            filaActual["CUIT"] = entidad.Cuit.ToString();
            filaActual["DireccionCLI"] = entidad.Direccion.ToString();
            filaActual["LocalidadCLI"] = entidad.Localidad.ToString();
            filaActual["ProvinciaCLI"] = entidad.Provincia.ToString();
            filaActual["TransporteCLI"] = entidad.Transporte.ToString();
            filaActual["ContactoCLI"] = entidad.Contacto.ToString();
            filaActual["TelefonoCLI"] = entidad.Telefono.ToString();
            filaActual["MovilCLI"] = entidad.Movil.ToString();  
            filaActual.EndEdit();
        }

        public static void BorrarDT(DataGridView gvwDatos, string origen, DataSet dt)
        {
            if (MessageBox.Show("¿Desea borrar este registro?", "Buscar", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                if (origen != "Clientes")
                {
                    var registro = ((DataRowView)gvwDatos.CurrentRow.DataBoundItem)["IdClienteCLI"].ToString();
                    DataRow[] foundRows;
                    foundRows = dt.Tables["Clientes"].Select("IdClienteCLI = " + registro);
                    foundRows[0].Delete();
                }
                DataRowView vistaFilaActual = (DataRowView)gvwDatos.CurrentRow.DataBoundItem;
                vistaFilaActual.Row.Delete();
            }
        }

        public static void GrabarDB(DataSet dt, MySqlConnection conn, MySqlTransaction tr)
        {
            try
            {
                MySqlDataAdapter da = AdaptadorABM(conn, tr);
                da.Update(dt, "Clientes");
            }
            catch (MySqlException ex)
            {
                MessageBox.Show(ex.ToString(), "NcSoft", MessageBoxButtons.OK, MessageBoxIcon.Information);
                dt.RejectChanges();
            }
        }

        private static MySqlDataAdapter AdaptadorSELECT()
        {
            SqlConnection1 = DALBase.GetConnection();
            SqlDataAdapter1 = new MySqlDataAdapter();
            SqlSelectCommand1 = new MySqlCommand("Clientes_Listar", SqlConnection1);
            SqlDataAdapter1.SelectCommand = SqlSelectCommand1;
            SqlSelectCommand1.CommandType = CommandType.StoredProcedure;
            return SqlDataAdapter1;
        }

        private static MySqlDataAdapter AdaptadorABM(MySqlConnection SqlConnection1, MySqlTransaction tr)
        {
            SqlDataAdapter1 = new MySqlDataAdapter();
            SqlInsertCommand1 = new MySqlCommand("Clientes_Insertar", SqlConnection1);
            SqlUpdateCommand1 = new MySqlCommand("Clientes_Actualizar", SqlConnection1);
            SqlDeleteCommand1 = new MySqlCommand("Clientes_Borrar", SqlConnection1);
            SqlInsertCommand1.Transaction = tr;
            SqlUpdateCommand1.Transaction = tr;
            SqlDeleteCommand1.Transaction = tr;
            SqlDataAdapter1.DeleteCommand = SqlDeleteCommand1;
            SqlDataAdapter1.InsertCommand = SqlInsertCommand1;
            SqlDataAdapter1.UpdateCommand = SqlUpdateCommand1;

            // IMPLEMENTACIÓN DE LA ORDEN UPDATE
            SqlUpdateCommand1.Parameters.Add("p_id", MySqlDbType.Int32, 11, "IdClienteCLI");
            SqlUpdateCommand1.Parameters.Add("p_razon", MySqlDbType.VarChar, 50, "RazonSocialCLI");
            SqlUpdateCommand1.Parameters.Add("p_cuit", MySqlDbType.VarChar, 50, "CUIT");
            SqlUpdateCommand1.Parameters.Add("p_direccion", MySqlDbType.VarChar, 50, "DireccionCLI");
            SqlUpdateCommand1.Parameters.Add("p_localidad", MySqlDbType.VarChar, 50, "LocalidadCLI");
            SqlUpdateCommand1.Parameters.Add("p_provincia", MySqlDbType.VarChar, 50, "ProvinciaCLI");
            SqlUpdateCommand1.Parameters.Add("p_transporte", MySqlDbType.VarChar, 50, "TransporteCLI");
            SqlUpdateCommand1.Parameters.Add("p_contacto", MySqlDbType.VarChar, 50, "ContactoCLI");
            SqlUpdateCommand1.Parameters.Add("p_telefono", MySqlDbType.VarChar, 50, "TelefonoCLI");
            SqlUpdateCommand1.Parameters.Add("p_movil", MySqlDbType.VarChar, 50, "MovilCLI");
            SqlUpdateCommand1.CommandType = CommandType.StoredProcedure;

            // IMPLEMENTACIÓN DE LA ORDEN INSERT
            SqlInsertCommand1.Parameters.Add("p_id", MySqlDbType.Int32, 11, "IdClienteCLI");
            SqlInsertCommand1.Parameters.Add("p_razon", MySqlDbType.VarChar, 50, "RazonSocialCLI");
            SqlInsertCommand1.Parameters.Add("p_cuit", MySqlDbType.VarChar, 50, "CUIT");
            SqlInsertCommand1.Parameters.Add("p_direccion", MySqlDbType.VarChar, 50, "DireccionCLI");
            SqlInsertCommand1.Parameters.Add("p_localidad", MySqlDbType.VarChar, 50, "LocalidadCLI");
            SqlInsertCommand1.Parameters.Add("p_provincia", MySqlDbType.VarChar, 50, "ProvinciaCLI");
            SqlInsertCommand1.Parameters.Add("p_transporte", MySqlDbType.VarChar, 50, "TransporteCLI");
            SqlInsertCommand1.Parameters.Add("p_contacto", MySqlDbType.VarChar, 50, "ContactoCLI");
            SqlInsertCommand1.Parameters.Add("p_telefono", MySqlDbType.VarChar, 50, "TelefonoCLI");
            SqlInsertCommand1.Parameters.Add("p_movil", MySqlDbType.VarChar, 50, "MovilCLI");
            SqlInsertCommand1.CommandType = CommandType.StoredProcedure;

            // IMPLEMENTACIÓN DE LA ORDEN DELETE
            SqlDeleteCommand1.Parameters.Add("p_id", MySqlDbType.Int32, 11, "IdClienteCLI");
            SqlDeleteCommand1.CommandType = CommandType.StoredProcedure;
            return SqlDataAdapter1;
        }

    }

}
